iT邦幫忙

2024 iThome 鐵人賽

DAY 9
0
Mobile Development

用Flutter Flame做遊戲!Live!系列 第 10

Forge2D的一些用法...

  • 分享至 

  • xImage
  •  

class Ball extends BodyComponent with TapCallbacks {
  Ball({Vector2? initialPosition})
      : super(
    fixtureDefs: [
      FixtureDef(
        CircleShape()..radius = 5,
        restitution: 0.8,
        friction: 0.4,
      ),
    ],
    bodyDef: BodyDef(
      angularDamping: 0.8,
      position: initialPosition ?? Vector2.zero(),
      type: BodyType.dynamic,
    ),
  );

  @override
  void onTapDown(_) {...}
}

class Wall extends BodyComponent {
  final Vector2 _start;
  final Vector2 _end;

  Wall(this._start, this._end);

  @override
  Body createBody() {
    final shape = EdgeShape()..set(_start, _end);
    final fixtureDef = FixtureDef(shape, friction: 0.3);
    final bodyDef = BodyDef(
      position: Vector2.zero(),
    );

    return world.createBody(bodyDef)..createFixture(fixtureDef);
  }
}

上一篇講到這個官方範例,今天再用一次。

可以看到BodyComponent在設計上有兩種策略,一是使用建構子、二是使用「createBody」這個函數。
而在createBody中,可以看到world都有相對相似名稱的函數接口去接收建構子中使用到的參數。

這兩個範例主要使用了兩個參數「fixtureDefs」和「bodyDef」,它們也有自己對應並專屬的物件類別「FixtureDef」和「BodyDef」。
靠著一次介紹了兩種不同類型的BodyComponent和不同的使用方式,我們可以一次了解很多東西...
但其實還不夠多。

比如「BodyType.dynamic」這個參數如果修改成「BodyType.static」,則這個BodyComponent會被固定在初始化時賦予的位置上。
比如範例在「FixtureDef」產生時傳入的第一項參數決定了這個BodyComponent的形裝類別,但有哪些形狀類別可以使用?
比如範例在「FixtureDef」產生時傳入的第二項參數「restitution」決定了這個BodyComponent和其他BodyComponent發生碰撞時的彈力大小,但不知道第三項參數的功用?(調整後看不出差異。)

如果要將一個物體設定為「發生碰撞時不旋轉」,就在BodyDef中設定「fixedRotation = true」。

(慢慢研究剩下的參數有何涵義與功能。)

例外,可以看到Forge2D也提供了「TapCallbacks」,還有「DragCallbacks」,只是沒有在範例中使用。


上一篇
Forge2D真是讓人蛋疼啊!
下一篇
繼續測試Forge2D的基本特性
系列文
用Flutter Flame做遊戲!Live!32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言